﻿#pragma once
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;


class CmdParameter {
public:
	const static int PRIORITY_OPTIONAL = 10000000;	//可选参数的优先级
	CmdParameter(string &str, const int i) :
		param(str), priority(i) {
	}
	;
	CmdParameter(string str, const int i) :
		param(str), priority(i) {
	}
	;
	CmdParameter() :
		param(""), priority(0) {
	}
	;
	/***********重载输出流运算符***************/
	friend ostream& operator<<(ostream &os , CmdParameter &para){
		os<< "[" << para.priority << ":" << para.param << "]";
		return os;
	}
	/***********重载比较运算符*********/
	bool operator>(const CmdParameter &para) const{
		if (priority != para.priority)
			return priority > para.priority;
		else
			return param > para.param;
	}
	bool operator<(const CmdParameter &para) const{
		if (priority != para.priority)
			return priority < para.priority;
		else
			return param < para.param;
	}
	bool operator==(const CmdParameter &para) const{
		return (priority == para.priority) && (param == para.param);
	}
	bool operator!=(const CmdParameter &para) const{
		return priority != para.priority;
	}
	bool operator<=(const CmdParameter &para) const{
		return (*this < para) || (*this == para);
	}
	bool operator>=(const CmdParameter &para) const{
		return (*this > para) || (*this == para);
	}

	/***********重载比较运算符*********/

	string param;								//参数内容
	int priority;								//参数位置

};
class CmdParamHandler {
public:

	//构造函数的传入参数，包含main函数的原始参入参数类型和可选参数列表和最大参数数
	//函数应当生成包含优先级的传入参数列表
	CmdParamHandler(int, char**, vector<string>&, int);

	//参数表中是否有这个可选参数
	bool hasThisOptPara(const string&);

	//返回优先级为x的参数
	string paraPrioX(int x);

	//检查参数表是否合法,不合法则禁止使用
	bool checkLegal();

	//打印参数表
	void showParams();

	//打印存在的可选参数表
	void showExistOpt();

	int maxParas;							//最大参数量
	int maxPrios;							//最大优先级
	vector<CmdParameter>::size_type optBeg;	//可选参数开始带迭器位置
private:
	vector<CmdParameter> parameterList;		//传入参数列表
	vector<string> optinalList;				//可选参数列表

	bool isParasLegal;						//参数表是否合法

};

